#include <iostream>

using namespace std;

#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <sys/wait.h>


// SIGCHILD 信号回收多个子进程
void handler(int signo)
{
	printf("get a signal: %d\n", signo);
	int ret = 0;
	while ((ret = waitpid(-1, NULL, WNOHANG)) > 0){
		printf("wait child %d success\n", ret);
	}
}
int main()
{
	signal(SIGCHLD, handler);
	if (fork() == 0){
		//child
		printf("child is running, begin dead: %d\n", getpid());
		sleep(3);
		exit(1);
	}
	//father
	while (1);
	return 0;
}



// block pending 的测试
// void signal_helper(int signo)
// {
//     cout << "signal: " << signo << endl;
// }

// int main()
// {
//     signal(SIGINT, signal_helper); // ctrl+c
//     sigset_t set;  
//     sigemptyset(&set);
//     sigaddset(&set, SIGINT);  
//     sigset_t old;
//     sigemptyset(&old);
//     sigprocmask(SIG_BLOCK, &set, &old); // block SIGINT
//     int cnt = 5;
//     while (true) // check pending
//     {
//         sigset_t pending;
//         sigpending(&pending);
//         for (int i = 1; i <= 31; ++i)
//         {
//             if (sigismember(&pending, i))
//             {
//                 cout << "1";
//             }
//             else
//             {
//                 cout<<"0";
//             }
//         }
//         cout<<endl;
//         sleep(1);
//         if (cnt-- == 0)
//         {
//             sigprocmask(SIG_SETMASK, &old, nullptr);
//         }
//     }

//     return 0;
// }